#ifndef PAGENUMBERFORMATTER_H
#define PAGENUMBERFORMATTER_H

#include <QString>
#include <QStringList>
#include <QDebug>

/**
 * PageNumberFormatter - 页码格式化器
 *
 * Martin Fowler重构：Extract Class
 *
 * 职责：
 * - 统一页码格式化逻辑，消除重复代码
 * - 提供预设格式和验证功能
 * - 支持本地页码和全局页码的格式化
 *
 * 设计原则：
 * - 无状态：所有方法都是静态的或基于参数
 * - 纯函数：相同输入产生相同输出
 * - 可测试：逻辑简单明确，易于单元测试
 */
class PageNumberFormatter
{
public:
    /**
     * 格式化上下文 - 封装所有格式化所需的信息
     * Martin Fowler重构：Introduce Parameter Object
     */
    struct FormatContext {
        int globalPage = 1;     // 全局页码（跨文件连续页码）
        int totalPages = 1;     // 总页数（全局）
        QString format = "{page}"; // 格式化字符串

        FormatContext() = default;

        FormatContext(int global, int total, const QString& fmt = "{page}")
            : globalPage(global), totalPages(total), format(fmt) {}

        // 调试支持
        QString toString() const {
            return QString("FormatContext(global:%1, total:%2, format:'%3')")
                .arg(globalPage).arg(totalPages).arg(format);
        }
    };

    /**
     * 格式化页码 - 核心功能
     *
     * @param context 格式化上下文，包含所有必要信息
     * @return 格式化后的页码字符串
     */
    static QString format(const FormatContext& context);

    /**
     * 获取预设格式列表
     *
     * @return 预设格式字符串列表
     */
    static QStringList getPresetFormats();

    /**
     * 验证格式字符串是否有效
     *
     * @param format 待验证的格式字符串
     * @return 是否为有效格式
     */
    static bool isValidFormat(const QString& format);

    /**
     * 获取格式描述（用于UI显示）
     *
     * @param format 格式字符串
     * @return 格式的描述文本
     */
    static QString getFormatDescription(const QString& format);

    /**
     * 生成预览文本（用于设置界面）
     *
     * @param format 格式字符串
     * @param sampleGlobal 示例全局页码
     * @param sampleTotal 示例总页数
     * @return 预览文本
     */
    static QString generatePreview(const QString& format,
                                 int sampleGlobal = 25,
                                 int sampleTotal = 100);

private:
    /**
     * 支持的占位符
     */
    static const QStringList SUPPORTED_PLACEHOLDERS;

    /**
     * 预设格式和描述的映射
     */
    static const QList<QPair<QString, QString>> PRESET_FORMATS;

    /**
     * 执行实际的字符串替换
     */
    static QString performSubstitution(const QString& format, const FormatContext& context);

    /**
     * 验证占位符是否受支持
     */
    static bool containsOnlySupportedPlaceholders(const QString& format);
};

/**
 * QDebug支持 - 便于调试
 */
inline QDebug operator<<(QDebug debug, const PageNumberFormatter::FormatContext& context)
{
    debug.nospace() << context.toString();
    return debug.space();
}

#endif // PAGENUMBERFORMATTER_H